package com.hson.demo.base.util.web;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.HashMap;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.ParseException;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;
import org.json.*;

public class HttpUtil {
	public static String post(String url, Map<String, String> params) {
		DefaultHttpClient httpclient = new DefaultHttpClient();
		String body = null;
		
		//System.out.println("create httppost:" + url);
		HttpPost post = postForm(url, params);
		
		body = invoke(httpclient, post);
		
		httpclient.getConnectionManager().shutdown();
		
		return body;
	}
	
	public static String get(String url) {
		DefaultHttpClient httpclient = new DefaultHttpClient();
		String body = null;
		
		//System.out.println("create httppost:" + url);
		HttpGet get = new HttpGet(url);
		body = invoke(httpclient, get);
		
		httpclient.getConnectionManager().shutdown();
		
		return body;
	}
		
	
	private static String invoke(DefaultHttpClient httpclient,
			HttpUriRequest httpost) {
		
		HttpResponse response = sendRequest(httpclient, httpost);
		String body = paseResponse(response);
		
		return body;
	}

	private static String paseResponse(HttpResponse response) {
		//System.out.println("get response from http server..");
		HttpEntity entity = response.getEntity();
		
		//System.out.println("response status: " + response.getStatusLine());
		//String charset = EntityUtils.getContentCharSet(entity);
		//System.out.println(charset);
		
		String body = null;
		try {
			body = EntityUtils.toString(entity);
			//System.out.println(body);
		} catch (ParseException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		return body;
	}

	private static HttpResponse sendRequest(DefaultHttpClient httpclient,
			HttpUriRequest httpost) {
		//System.out.println("execute post...");
		HttpResponse response = null;
		
		try {
			response = httpclient.execute(httpost);
		} catch (ClientProtocolException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return response;
	}

	private static HttpPost postForm(String url, Map<String, String> params){
		
		HttpPost httpost = new HttpPost(url);
		List<NameValuePair> nvps = new ArrayList <NameValuePair>();
		
		Set<String> keySet = params.keySet();
		for(String key : keySet) {
			nvps.add(new BasicNameValuePair(key, params.get(key)));
		}
		
		try {
			//System.out.println("set utf-8 form entity to httppost");
			httpost.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8));
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		
		return httpost;
	}
	
	@SuppressWarnings({ "rawtypes", "unchecked" })
	public static void main(String[] args) {
		String appId = "html5";
		String appSecret = "html5secretcode";
		String result = HttpUtil.get("http://localhost:8080/ESBServer/sysApi/appAuthenticate?appId=" + appId + "&appSecret=" + appSecret);
		System.out.println("===>Get access token: " + result);
		
		JSONObject jsonObject = new JSONObject(result);
		
		String accessToken = jsonObject.getJSONObject("returnObject").getString("access_token");
		
		String jsonStr = "{\"OAUserId\": \"11108038\",\"FdTemplateId\": \"14a32d891f3e3b7d5c894ec45e985434\",\"DocSubject\": \"test workflow doc subject from grails\",\"FdKeyword\": [ \"keyword1\", \"keyword2\" ], \"FormValues\": { \"fd_content\": \"接口测试内容123\"} }";
		
		Map postValues = new HashMap();
		postValues.put("jsonStr", jsonStr);
		result = HttpUtil.post("http://localhost:8080/ESBServer/oaWorkflowApi/startWorkflow?access_token=" + accessToken, postValues);
		
		System.out.println("===>Start workflow return: " + result);
		jsonObject = new JSONObject(result);
		
		String flowDocId = jsonObject.getString("returnObject");
		result = HttpUtil.get("http://localhost:8080/ESBServer/oaWorkflowApi/getWorkflowStatus?access_token=" + accessToken + "&flowDocId=" + flowDocId);
		System.out.println("===>Workflow status: " + result);
		
		result = HttpUtil.get("http://localhost:8080/ESBServer/oaWorkflowApi/getWorkflowData?access_token=" + accessToken + "&flowDocId=" + flowDocId + "&fieldsList=fd_content");
		System.out.println("===>Workflow status: " + result);
		
	}
}
